from QQLoginTool.QQtool import OAuthQQ
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView

from mall import settings
from .models import OAuthQQUser
from .serializers import QQOauthUserSerializers


# Create your views here.


# 当用户点击a标签的时候,前段回发送一个 ajax请求
# 需要后端 生成一个 qq扫瞄的url

class QQauthLoginURLView(APIView):
    """
    GET /oauth/qq/authorization/
    """
    def get(self,request):

        # 我们看了半天文档不知道这个参数是干什么的
        # 但是 我们知道这个参数 必须要传,我们就看到文档这么中 有一个地方这么写
        state = "/"

        # 1.创建对象
        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                        client_secret=settings.QQ_CLIENT_SECRET,
                        redirect_uri=settings.QQ_REDIRECT_URI,
                        state=state,
                        )

        # 2.调用对象的方法,获取url
        auth_url = oauth.get_qq_url()

        return Response({'auth_url':auth_url})



class QQOauthUserView(APIView):

    """
    GET   oauth/qq/users/?code=xxxxx
    """
    def get(self,request):
        # 1.接收code
        code = request.query_params.get("code")
        print(code)
        print(1)

        if code is None:
            return Response({'msg':"缺少参数"},status=status.HTTP_400_BAD_REQUEST)

        # 传递code
        oauth = OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                        client_secret=settings.QQ_CLIENT_SECRET,
                        redirect_uri=settings.QQ_REDIRECT_URI,)

        try:
            access_token = oauth.get_access_token(code)

            # 有了token 就可以获取其他信息了,例如 openid

            openid = oauth.get_open_id(access_token)

        except Exception as e:
            print(e)
            return Response({"msg":'获取失败'},status=status.HTTP_400_BAD_REQUEST)

        # 针对于 获取的openid 存在2个情况
        # 如果用户至前绑定过,则应该直接登陆
        # 如果用户至前没有绑定过,则应该跳转到绑定页面
        try:
            qquser = OAuthQQUser.objects.get(openid=openid)
        except OAuthQQUser.DoesNotExist:
            # 说明没有绑定过 ,则跳转到绑定页面

            # 1.openid需要进行加密处理
            # 2.对openid 这个绑定操作进行一个时间的处理 需要有一定的时效

            # 1.创建序列化器
            # 2.对openid进行处理
            # 3.因为dumps返回的是二进制
            from oauth.utlis import generic_openid_token
            openid_token = generic_openid_token(openid)


            return Response({'access_token':openid_token})

        else:
            # else 没有异常的时候执行
            from rest_framework_jwt.settings import api_settings
            # 我们需要获取　2个方法
            jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
            jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

            # 1.jwt_payload_handler 我们需要将用户的信息传递给这个函数,函数自己或获取user中的数据
            # 获取了之后,会生成一个二进制
            payload = jwt_payload_handler(qquser.user)
            # 2.需要对payload　进行编码　编码之后才是token
            token = jwt_encode_handler(payload)

            return Response({
                'token':token,
                'user_id':qquser.user.id,
                'username':qquser.user.username
            })


    def post(self,request):

        # 1.前端将绑定的数据access_token(openid),mobile,password,sms_code
        data = request.data

        # 2.后台接收到数据进行校验
        serializer = QQOauthUserSerializers(data=data)
        serializer.is_valid(raise_exception=True)
        # 3.数据入库
        qquser = serializer.save()

        from rest_framework_jwt.settings import api_settings
        # 我们需要获取　2个方法
        jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
        jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

        # 1.jwt_payload_handler 我们需要将用户的信息传递给这个函数,函数自己或获取user中的数据
        # 获取了之后,会生成一个二进制
        payload = jwt_payload_handler(qquser.user)
        # 2.需要对payload　进行编码　编码之后才是token
        token = jwt_encode_handler(payload)

        # 4.返回响应
        return Response({
            'token': token,
            'user_id': qquser.user.id,
            'username': qquser.user.username
        })





# from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
#
# # 1.创建序列化器
# # 参数1:秘钥
# # 参数2:秒数
# s = Serializer('abc',3600)
#
# # 2.对敏感数据进行处理
# dict = {
#     'openid':"123456"
# }
#
# token = s.dump(dict)
#
#
#
# #####################验证数据
#
#
# # 1.创建序列化器
# # 参数1:秘钥
# # 参数2:秒数
# s = Serializer('abc',3600)
#
# # 解码操作
# s.loads(token)
#
#
# #########验证有效期
#
# s = Serializer('abc',1)
#
# dict = {
#     'openid':"123456"
# }
#
# token = s.dump(dict)

